package com.bjpowernode.javase.exception;

/**
 * 1、Object下有Throwable(可抛出的)
 * Throwable下有两个分支Error（不可处理，直接退出JVM）和Exception（可处理的）
 * Exception下有两个分支：
 *  Exception的直接子类：编译时异常。
 *      编译时异常要求程序员在编写程序阶段必须预先对这些异常进行处理，如果不处理编译器报错，因此得名编译时报错。
 *  RuntimeException：运行时异常。
 *       运行时异常在编写程序阶段，程序员可以预先处理，也可以不管。
 *
 *  2、编译时异常和运行时异常都是发生在运行阶段，编译阶段异常是不会发生的。
 *  编译时异常因为什么而得名，因为编译时异常必须在编写阶段预先处理，不处理编译器报错。
 *  所有的异常都是在运行阶段发生，因为只有程序运行阶段才可以new对象。
 *  因为异常的发生就是new异常对象。
 *
 *  3、编译时异常和运行时异常的区别？
 *      编译时异常一般发生的概率较高。
 *          对一些发生概率较高异常，需要在运行之前对其进行预处理。
 *
 *
 *      运行时异常一般发生的概率较低。
 *          举个例子：
 *              小明走在大街上可能会被天上飞机的轮子砸到。
 *             被飞机轮子砸到也是一种异常。
 *             但是这种异常发生较低。
 *  4、编译时异常还有其它的名字：
 *      受检异常：CheckedException
 *      受控异常
 *
 *  5、运行时异常还有其它的名字：
 *      为受检异常：UnCheckedException
 *      非受控异常
 *
 *  6、再次强调：所有的异常都是在运行阶段发生的。
 *
 *  7、Java语言中对异常的处理包括两种方式;
 *      第一种方式：在方法声明的位置上，使用throws关键字，抛给上一级。
 *      第二种方式：使用try...catch语句进行捕捉。
 *
 *  8、注意：java中异常发生之后如果一直上抛，最终给了main方法，main方法
 *  向上抛，抛给了调用者JVM，JVM知道了这个异常只有一个结果，终止程序的运行。
 *
 *
 *
 */
public class ExceptionTest03 {
    public static void main(String[] args) {
        System.out.println(100/0);
        /*
        程序执行到此处发生了ArithmeticException异常，底层new出了一个
        ArithmeticException异常对象，然后抛出，由于是main方法调用了100/0
        所以讲异常ArithmeticException抛给了main方法，main方法没有处理异常，
        将这个异常抛给了JVM，JVM最终终止了程序的执行。

         ArithmeticException 继承 RuntimeException:属于运行时异常，在编译阶段不需要对这种异常进行处理。

         */

        System.out.println("Hello World!");
    }
}
